/***************************************************************************************************
  *Copyright(C),2010-2016,Sumscope
  *FileName	:  Convert.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2015/03/25
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "simple_array.h"
#include "BaseString.h"
#include "WideString.h"
#include "../core.h"
#include <vector>

namespace qb{
namespace base{
using namespace std;
class S_CORE_EXPORT CConvertFast{							// 单线程版本
	typedef SimpleArray<char> CharBuf;
	typedef SimpleArray<wchar_t> WideBuf;
	CharBuf*				m_str;
	WideBuf*				m_wstr;
	int						m_str_len;
	int						m_wstr_len;
public:
	CConvertFast();
	~CConvertFast();
	const char* ToUtf8(const char* gb2312,int len=-1);				// gbk ==>utf8
	const wchar_t* ToWide(const char* gbk, int len);	// gbk ==>wide

	const char* ToUtf8(const wchar_t* wstr,int len);	// wide==>utf8
	const char* ToGbk(const wchar_t* wstr, int len);	// wide==>gbk

	const char* ToGbk(const char* utf8,int inlen = -1);	// utf8==>gbk
	const char* ToGbkEx(const char* utf8, int inlen = -1);	// utf8==>gbk
	const wchar_t* UToWide(const char* utf8, int len);	// utf8==>wide

	const char* ToGbkTruncate(int capcity, const char* utf8, int inlen,bool comma=false);
	
	int  GetWstrSize()const{return m_wstr_len;}
	int  GetStrSize()const{return m_str_len;}
	int  GetWstrSize(const char* gbk,int len);
	int  GetStrSize(const wchar_t *pwstr,int len);
};
S_CORE_EXPORT bool FastToWideString(const char* buffer,WideString& szRet);
//////////////////////////////////////////////////////////////////////////
// 多线程版本
S_CORE_EXPORT BaseString G2U(const BaseString& gb2312);
S_CORE_EXPORT BaseString G2UT(const BaseString& gbk);
S_CORE_EXPORT BaseString U2G(const BaseString& utf8);
S_CORE_EXPORT BaseString U2GT(const BaseString& utf8);
S_CORE_EXPORT BaseString G2J(const BaseString& str);	// gbk->json
S_CORE_EXPORT BaseString J2G(const BaseString& str);	// json->gbk


S_CORE_EXPORT BaseString W2U(const wchar_t *pwstr,int len=-1);
S_CORE_EXPORT WideString U2W(const char* utf8,int len=-1);

S_CORE_EXPORT WideString G2W(const char* gbk,int len=-1);
S_CORE_EXPORT BaseString  W2G(const wchar_t *pwstr,int len=-1);
S_CORE_EXPORT int W2GSize(const wchar_t *pwstr,int len=-1);
S_CORE_EXPORT int G2WSize(const wchar_t *pwstr,int len=-1);
S_CORE_EXPORT void G2WC(const char* gbk,wchar_t& wc);
S_CORE_EXPORT void W2GC(const wchar_t& wc,char* gbk);
//////////////////////////////////////////////////////////////////////////

std::vector<BaseString>& U2G(std::vector<BaseString>& utf8);
std::vector<std::pair<BaseString, double>>& U2G(std::vector<std::pair<BaseString, double>>& utf8);
std::vector<std::pair<BaseString, BaseString>>& U2G(std::vector<std::pair<BaseString, BaseString>>& utf8);

}//namespace base;
}//namespace qb;
